package com.ycg.biquge.service.impl;

import cn.dev33.satoken.basic.SaBasicUtil;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.context.SaTokenContext;
import cn.dev33.satoken.same.SaSameUtil;
import cn.dev33.satoken.secure.SaSecureUtil;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycg.biquge.common.Result;
import com.ycg.biquge.common.UserContext;
import com.ycg.biquge.pojo.User;
import com.ycg.biquge.service.UserService;
import com.ycg.biquge.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * @author lenovo
 * @description 针对表【user(用户表)】的数据库操作Service实现
 * @createDate 2024-04-30 20:20:39
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
        implements UserService {

    @Value("${biquge.salt}")
    private String salt;

    /**
     * 登录 ,是否存在该手机号, 密码比对
     * @param user 电话和密码
     * @return token
     */
    @Override
    public Result<String> login(User user) {
        // 根据phone查询用户
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class).eq(User::getPhone, user.getPhone());
        User one = getOne(wrapper);
        // 用户不存在直接返回
        if (ObjectUtil.isNull(one)) {
            return Result.error("用户未注册!");
        }
        // 用户存在, 进行密码比对
        // 用户输入加密后的密码
        String md5Password = SaSecureUtil.md5BySalt(user.getPassword(), salt);
        // 数据库密码
        String dbPassword = one.getPassword();
        // 密码不相等则返回错误
        if (!StrUtil.equals(md5Password, dbPassword)) {
            return Result.error("密码错误!");
        }
        // 用户存在, 密码正确 登录返回token
        StpUtil.login(one.getId());
        String token = StpUtil.getTokenValue();
        return Result.ok(token + "&" + one.getPhone().substring(7));
    }

    /**
     * 注册, 将密码加密后再写入数据
     * @param user 电话和密码
     * @return token
     */
    @Override
    public Result<String> register(User user) {
        // 根据phone查询是否已经存在该用户
        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class).eq(User::getPhone, user.getPhone());
        User one = getOne(wrapper);
        // 存在则返回
        if (ObjectUtil.isNotNull(one)) {
            return Result.error("用户已存在");
        }
        // 密码加密
        String password = user.getPassword();
        String md5Pass = SaSecureUtil.md5BySalt(password, salt);
        user.setPassword(md5Pass);
        // 保存到数据库
        save(user);
        // 自动登录
        StpUtil.login(user.getId());
        // 返回token
        String tokenValue = StpUtil.getTokenValue();
        return Result.ok(tokenValue+ "&" + user.getPhone().substring(7));
    }


    /**
     * 登出
     * @return ok
     */
    @Override
    public Result<String> logout() {
        // 获取用户id
        Integer id = UserContext.getUser().getId();
        // satoken登出 StpUtil
        StpUtil.logout(id);
        return Result.ok("登出成功");
    }
}




